package mfuny.ggongal.admin.etc;

import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;

import mfuny.ggongal.admin.debug.Debug;

import org.json.simple.JSONObject;
import org.springframework.web.multipart.MultipartFile;

public class Module {
	//db에서 받은 데이트 문자를 데이트 객체로 변환하기.
	@SuppressWarnings("deprecation")
	public static Date strToDate(String days) {
		Date d = null;
		
		// "/" 이게 있는 경우 (ex: 2014-8-8/21).
		if( days.indexOf("/") > -1 ) {
			String[] dTemp1 = days.split("/");
			String[] dTemp2 = dTemp1[0].split("-");
			d = new Date(
						Integer.parseInt(dTemp2[0]) - 1900,
						Integer.parseInt(dTemp2[1]) - 1,
						Integer.parseInt(dTemp2[2]),
						Integer.parseInt(dTemp1[1]),
						0,
						0
					);
			return d;
		}
		
		//빈칸이 있는지 여부(시간이 있으면).
		if( days.indexOf(" ") > -1 ) {
			String[] dTemp1 = days.split(" ")[0].split("-");
			String[] dTemp2 = days.split(" ")[1].split(":");
			dTemp2[2] = dTemp2[2].split("\\.")[0];
			
			d = new Date(
						Integer.parseInt(dTemp1[0]) - 1900,
						Integer.parseInt(dTemp1[1]) - 1,
						Integer.parseInt(dTemp1[2]),
						Integer.parseInt(dTemp2[0]),
						Integer.parseInt(dTemp2[1]),
						Integer.parseInt(dTemp2[2])
					);
		}
		
		//빈칸이 없으면(시간이 없으면).
		else {
			String[] dTemp1 = days.split(" ")[0].split("-");
			d = new Date(
					Integer.parseInt(dTemp1[0]) - 1900,
					Integer.parseInt(dTemp1[1]) - 1,
					Integer.parseInt(dTemp1[2])
				);
		}
		
		return d;
	}
	
	//데이트 객체를 db와 일치한 형식의 문자열로 변환하기.
	@SuppressWarnings("deprecation")
	public static String dateToStr(Date date) {
		StringBuffer sb = new StringBuffer();
		sb.append((date.getYear() + 1900) + "-" + (date.getMonth() + 1) + "-" + date.getDate() + " ");
		sb.append(date.getHours() + ":" + date.getMinutes() + ":" + date.getSeconds() + ".0");
		
		return sb.toString();
	}
	
	//해당 월의 마지막 날짜 구하기.
	@SuppressWarnings("deprecation")
	public static int getLastDay(Date date) {
		int year = date.getYear() + 1900;
		int month = date.getMonth();
		
		Calendar cal = Calendar.getInstance(); 

		cal.set( year, month, 1 ); 
		
		return cal.getActualMaximum(Calendar.DATE);
	}
	
	
	// 임시 비번 생성기.
	public static String shufflePin(int len) {
		char[] charSet = new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };

		int idx = 0;
		StringBuffer sb = new StringBuffer();
		for (int i = 0; i < len; i++) {
			idx = (int) (charSet.length * Math.random());
			sb.append(charSet[idx]);
		}

		return sb.toString();
	}
	
	//파일 To 서버 (미사용 나중에 필요할지도..).
	//서버정보 ( ip, port, saveName, savePath) 소켓....
	@SuppressWarnings({ "unchecked", "resource" })
	public JSONObject outputToServer(MultipartFile file, List<HashMap<String, Object>> serverList) {
		Socket socket = null;
		ObjectOutputStream oos = null;
		ObjectInputStream ois = null;
		
		JSONObject fileInfo = new JSONObject();
		
		try {
			for( HashMap<String, Object> server : serverList ) {
				String fileEx = file.getOriginalFilename().split("\\.")[1];
				fileInfo.put("saveName", System.currentTimeMillis() + (String)server.get("saveName") + "." + fileEx);
				fileInfo.put("savePath", (String)server.get("savePath"));
				fileInfo.put("capacity", file.getSize());
				
				socket = new Socket( (String)server.get("ip"), (Integer)server.get("port") );
				oos = new ObjectOutputStream(socket.getOutputStream());
				
				//파일명, 저장 경로 JSON으로 전송.
				oos.writeObject(fileInfo.toJSONString());
				
				//파일전송.
				oos.write(file.getBytes());
				
				//결과받기.
				ois = new ObjectInputStream(socket.getInputStream());
				boolean result = ois.readBoolean();
				if( result ) {
					fileInfo.put("isSuccess", result);
					
				} else {
					throw new Exception("업로드 후 서버에서 파일 저장시 에러");
				}
			}
			
		} catch ( Exception e ) {
			try {
				Debug.toDebugFile(e, "outputToServer");
			} catch (Exception e1) {
				e1.printStackTrace();
			}
			
			fileInfo.put("isSuccess", false);
		}
		
		return fileInfo;
	}
}
